#include "jrpc.h"

namespace jrpc
{
	JsonProtocol::JsonProtocol(json11::Json::object& o) :
		_obj(json11::Json::object{ { "__args", o } })
	{
	}
	bool JsonProtocol::is_null()
	{
		return _obj.is_null();
	}
	void JsonProtocol::parse(const string& in, string& err)
	{
		_obj = json11::Json::parse(in.c_str(), err);
	}

	string JsonProtocol::dumps() const
	{
		return std::move(_obj.dump());
	}

	bool JsonProtocol::is_error()
	{
		return _obj["__errno"].int_value() != 0;
	}

	void JsonProtocol::set_method(const string & method)
	{
		((map<string, json11::Json>&)_obj.object_items())["__method"] = method;
	}

	string JsonProtocol::method()
	{
		return _obj["__method"].is_string() ? _obj["__method"].string_value() : "";
	}

	const json11::Json & JsonProtocol::args() const
	{
		return _obj["__args"];
	}

	std::tuple<int32_t, string> JsonProtocol::error()
	{
		int32_t errorno = _obj["__errno"].int_value();
		string errmsg = _obj["__errmsg"].string_value();
		return std::tie(errorno, errmsg);
	}

	void JsonProtocol::set_error(const int errorno, const char * errmsg)
	{
		_obj = json11::Json::object{ {"__errno", errorno }, {"__errmsg", errmsg} };
	}

	json11::Json json_null(const string & data)
	{
		return data.empty() ? json11::Json() : data;
	}

	json11::Json json_load(const string& data)
	{
		string err;
		auto obj = json11::Json::parse(data.c_str(), err);
		return std::move(obj);
	}
}
